由於之後我們會解說到像是Gin搭配RDBMS或是Gin搭配Cache....等,因此在這章節我們將會寫好我們gin example所要用到的Dockerfile以及搭配的docker-compose。
FROM golang:latest
RUN mkdir -p /usr/local/go/src/ironman-2021
WORKDIR /usr/local/go/src/ironman-2021
ADD . /usr/local/go/src/ironman-2021
RUN go mod download
RUN go build ./main.go
EXPOSE 8080
CMD ["./main"]
$GOPATH之下go mod download,下載所有用到的第三方套件main.go 主程式檔對docker不熟者可以去參考我去年的鐵人賽文章,連結在此
https://ithelp.ithome.com.tw/users/20129737/ironman/3501
前半部分都是圍繞著docker以及docker-compose解說
version: '3.5'
services:
  postgresql:
    container_name: postgresql
    image: postgres:12.7
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
      timeout: 45s
      interval: 10s
      retries: 10
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
      - APP_DB_USER=ironman
      - APP_DB_PASS=password
      - APP_DB_NAME=gorm
    volumes:
    - ./db:/docker-entrypoint-initdb.d/
    networks:
      - backend-bridge
    restart: always
  redis:
    container_name: redis
    image: redis:latest
    ports:
    - "6379:6379"
    networks:
      - backend-bridge
    restart: always
  ironman-2021:
    container_name: ironman-2021
    ports:
      - "8080:8080"
    build:
      context: ./
      dockerfile: Dockerfile
    command: ./main
    restart: always
    networks:
      - backend-bridge
    depends_on:
      - postgresql
      - redis
networks:
  backend-bridge:
    driver: bridge
volumes:
  data: {}
env extension file的形式匯入,而這個container會在之後的gorm篇章使用到。以上部分也是如有不懂可以參考我去年鐵人賽文章!
https://ithelp.ithome.com.tw/users/20129737/ironman/3501
前半部分都是圍繞著docker以及docker-compose解說
最後則是main.go部分,它與day-16 branch比起來多了匯入.env變數的部分!
package main
import (
	"github.com/gin-gonic/gin"
	"github.com/joho/godotenv"
	"ironman-2021/app/config"
	"os"
)
func main() {
	envErr := godotenv.Load()
	if envErr != nil {
		panic(envErr)
	}
	port := os.Getenv("PORT")
	app := gin.Default()
	app.GET("/hc", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "health check",
		})
	})
	config.RouteUsers(app)
	err := app.Run(":" + port)
	if err != nil {
		panic(err)
	}
}
.env檔案的存在,沒有的話會出現 Error loading .env file 的錯誤,有的話則接下來就能讀取.env之中的變數資料。這章節我們做了許許多多未來後端開發的事前準備,像是下個章節解說gorm時所要用到的postgresql,以及所需吃到環境變數的godotenv等,這也讓我們往後的開發事半功倍。
這章節的程式碼也會放在下方連結~
https://github.com/Neskem/Ironman-2021/tree/Day-17